/**
 * @file rscApplication.c
 * @brief Funzioni che gestiscono le risorse applicative.
 *
 * Complete description of this file.
 *
 * @date Mar 16, 2012
 * @author Francesco Corvino
 */
#include "rscApplication.h"
#include "../logproxy/logproxy.h"
#include <pthread.h>

static Application application;

/////////////////////////////////////////////////////////////////////////////////////////
/////// Funzioni per la gestione dei comandi e delle richieste //////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
static pthread_mutex_t commandArr;

DynArray* RscApp_getCommands(){
	//TODO prevedere dei controlli di concorrenzialità
	return &(application.commands);
}

void RscApp_addCommand(InterfaceCommand * cmd){
	pthread_mutex_lock(&commandArr);
	DynArray_add(&(application.commands),cmd);
	pthread_mutex_unlock(&commandArr);
}

void RscApp_delCommand(InterfaceCommand * cmd){
	pthread_mutex_lock(&commandArr);
	DynArray_remove(&(application.commands),cmd);
	pthread_mutex_unlock(&commandArr);
}

UserRequest * RscApp_getRequest(int keySession){
	return (UserRequest*) CMap_get(&(application.requests),keySession);
}

void RscApp_updateRequest(UserRequest * req, int keySession){
	CMap_set(&(application.requests),keySession,req,sizeof(UserRequest));
}


/////////////////////////////////////////////////////////////////////////////////////////
/////// Funzioni per la gestione degli attributi ////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

void RscApp_setAttribute(void * elem, const int key, size_t size){
	CMap_set(&(application.attributes),key,elem,size);
}

void RscApp_addAttribute(void * elem, const int key, size_t size){
	if(CMap_has(&(application.attributes),key)) return;
	CMap_set(&(application.attributes),key,elem,size);
}

void* RscApp_getAttribute(const int key){
	return CMap_get(&(application.attributes),key);
}

//////////////////////////////////////////////////////////////////////////////
////// Gestione dei dati che riguardano lo stato delle sessioni //////////////
//////////////////////////////////////////////////////////////////////////////

/**
 * @deprecated Utilizzare FactComm_getSessions()
 *
 * @todo rimuovere questa funzione e sostituire i riferimenti con FactComm_getSessions()
 *
 * @return
 */
CMap * RscApp_getAllSession(){
	return FactComm_getSessions();
}

/////////////////////////////////////////////////////////////////////////////////////////
/////// Inizializzazione dei dati ///////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////

/**
 * @brief Inizializza e risorse applicative inserendo gli opportuni elementi
 */
Application * RscApp_init(){
	log_level(LOG_INFO_LEVEL,"inizializzo i dati applicativi");

	CMap_init(&(application.attributes));
	CMap_init(&(application.hostSession));

	/// - inizializza la struttura per i comandi
	DynArray * commands = &(application.commands);
	DynArray_init(commands, Command_cmp, sizeof(InterfaceCommand));
	/// - inizializza il rispettivo mutex
	pthread_mutex_init(&commandArr,NULL);

	/// - inizializza la struttura per le richieste
	CMap_init(&(application.requests));

	return &application;
}
